Remove the drop feedback row a little time after drag_leave
authorFederico Mena Quintero <federico@gnome.org>
Sat, 20 Apr 2013 18:20:07 +0000 (14:20 -0400)
committerFederico Mena Quintero <federico@gnome.org>
Sat, 20 Apr 2013 18:53:03 +0000 (14:53 -0400)
Since ::drag-leave gets emitted before ::drag-drop, we can't just remove the drop feedback row
in drag-leave, as we *need* it during drag-drop.  So, we use the same trick as in testdnd.c - we
install a timeout handler in our drag-leave callback, and remove the feedback in the timeout callback.

Signed-off-by: Federico Mena Quintero <federico@gnome.org>
gtk/gtkplacessidebar.c

index 35e218372f548223034883afb0017c79696e6be0..acbd59e1ea97f93ba409c8552b2c48b3dd8adb23 100644 (file)
@@ -165,6 +165,7 @@ struct _GtkPlacesSidebar {
 
        DropState drop_state;
        int new_bookmark_index;
+       guint drag_leave_timeout_id;
 
        guint show_desktop : 1;
 };
@@ -1312,7 +1313,7 @@ compute_drop_position (GtkTreeView             *tree_view,
                goto out;
        }
 
-o      /* Never drop on headings, but special case the bookmarks heading,
+       /* Never drop on headings, but special case the bookmarks heading,
         * so we can drop bookmarks in between it and the first bookmark.
         */
        if (place_type == PLACES_HEADING
@@ -1606,15 +1607,30 @@ drag_motion_callback (GtkTreeView *tree_view,
        return TRUE;
 }
 
+static gboolean
+drag_leave_timeout_cb (gpointer data)
+{
+       GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (data);
+
+       free_drag_data (sidebar);
+       stop_drop_feedback (sidebar);
+       remove_drop_bookmark_feedback_row (sidebar);
+
+       sidebar->drag_leave_timeout_id = 0;
+       return FALSE;
+}
+
 static void
 drag_leave_callback (GtkTreeView *tree_view,
                     GdkDragContext *context,
                     unsigned int time,
                     GtkPlacesSidebar *sidebar)
 {
-       free_drag_data (sidebar);
-       stop_drop_feedback (sidebar);
-       remove_drop_bookmark_feedback_row (sidebar);
+       if (sidebar->drag_leave_timeout_id)
+               g_source_remove (sidebar->drag_leave_timeout_id);
+
+       sidebar->drag_leave_timeout_id = gdk_threads_add_timeout (500, drag_leave_timeout_cb, sidebar);
+
        g_signal_stop_emission_by_name (tree_view, "drag-leave");
 }
 
@@ -3779,6 +3795,11 @@ gtk_places_sidebar_dispose (GObject *object)
 
        sidebar->tree_view = NULL;
 
+       if (sidebar->drag_leave_timeout_id) {
+               g_source_remove (sidebar->drag_leave_timeout_id);
+               sidebar->drag_leave_timeout_id = 0;
+       }
+
        free_drag_data (sidebar);
 
        if (sidebar->bookmarks_manager != NULL) {